/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package ar.com.remiseria.bo;

import ar.com.remiseria.dao.ViajeDAO;
import ar.com.remiseria.entities.Auto;
import ar.com.remiseria.entities.Chofer;
import ar.com.remiseria.entities.Cliente;
import ar.com.remiseria.entities.Domicilio;
import ar.com.remiseria.entities.Viaje;
import ar.com.remiseria.utils.Constantes;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.hibernate.HibernateException;

/**
 *
 * @author mcvalls
 
 Toda la logica de negocios correspondiente a los viajes debe ir aqui
 * 
 */
public class ViajeBO {
    
    ViajeDAO viajeDAO = new ViajeDAO();
    
    public Viaje saveNewViaje(Cliente cliente, Domicilio origen, Domicilio destino, Calendar fechaRecogida, Chofer chofer, Auto auto){
        DomicilioBO domicilioBO = new DomicilioBO();
        // Reviso si el domicilio de origen existe, sino, hay que crearlo en la DB
//        if(this.validarOrigen(cliente, origen)){
//            origen = cliente.getDomicilio();
//        }else{
//            try {
//                origen = domicilioBO.saveNewDomicilio(origen);
//            } catch (Exception ex) {
//                Logger.getLogger(ViajeBO.class.getName()).log(Level.SEVERE, null, ex);
//            }
//        }
        try {
            origen = domicilioBO.saveNewDomicilioIfNotExists(origen);
            // Guardo el destino
            destino = domicilioBO.saveNewDomicilioIfNotExists(destino);
        } catch (Exception ex) {
            Logger.getLogger(ViajeBO.class.getName()).log(Level.SEVERE, null, ex);
        }
        
        if(fechaRecogida == null){
            fechaRecogida = Calendar.getInstance();
        }
//        Viaje viaje = new Viaje(null, cliente, chofer, auto, origen, destino, fechaRecogida, null);
        Viaje viaje = new Viaje();
        viaje.setAutoAsignado(auto);
        viaje.setChoferAsignado(chofer);
        viaje.setClienteSolicitante(cliente);
        viaje.setDomicilioOrigen(origen);
        viaje.setDomicilioDestino(destino);
        viaje.setFechaDeRecogida(fechaRecogida);
        viaje.setEstado(Constantes.ESTADO_VIAJE_PENDIENTE); // La fecha seteada es mayor que la actual, por ende el viaje es pendiente
        
        
        viaje = viajeDAO.saveNew(viaje);
        
        return viaje;
    }

    private boolean validarOrigen(Cliente cliente, Domicilio origen) { // SI EL ORIGEN ES EL MISMO DOMICILIO
                                                        // QUE EL DEL CLIENTE, SE DEVUELVE TRUE
        if(!cliente.getDomicilio().getCalle().equalsIgnoreCase(origen.getCalle())){
            return false;
        }
        if(!cliente.getDomicilio().getNumero().equals(origen.getNumero())){
            return false;
        }
        if(!cliente.getDomicilio().getPiso().equals(origen.getPiso())){
            return false;
        }
        if(!cliente.getDomicilio().getDepartamento().equalsIgnoreCase(origen.getDepartamento())){
            return false;
        }
        if(!cliente.getDomicilio().getCodigoPostal().equals(origen.getCodigoPostal())){
            return false;
        }
        if(!cliente.getDomicilio().getLocalidad().equalsIgnoreCase(origen.getLocalidad())){
            return false;
        }
        if(!cliente.getDomicilio().getProvincia().equalsIgnoreCase(origen.getProvincia())){
            return false;
        }
        return true;
    }

    public void deleteChoferAsignado(Chofer chofer) throws Exception {
         
       try{
           List<Viaje> viajes = viajeDAO.getViajesByChoferAsignado(chofer);
           if(viajes != null && !viajes.isEmpty()){
               for(Viaje viaje : viajes){
                   viaje.setChoferAsignado(null);
                   viajeDAO.update(viaje);
               }
           }           
       }catch(HibernateException ex){
           throw new Exception(ex);
       }
        
    }

    public List<Viaje> getAllViajes() throws Exception{
        List<Viaje> losViajes;
        
        try{
            losViajes = viajeDAO.getAll(Viaje.class);
        }catch(HibernateException ex){
            throw new Exception(ex);
        }
        
        return losViajes;
    }
    
    public List<Viaje> getAllViajesOrderByFecha() throws Exception{
        List<Viaje> losViajes;
        
        try{
            losViajes = viajeDAO.getAllOrderByFecha();
        }catch(HibernateException ex){
            throw new Exception(ex);
        }
        
        return losViajes;
    }

    public List<Viaje> getViajesByFiltro(String filtro, String palabraClave) throws Exception {
        List<Viaje> losViajes;
        
        filtro = filtro.toLowerCase();
        
        if(filtro.equals("origen")){
            filtro = "domicilioOrigen";
        }else if(filtro.equals("destino")){
            filtro = "domicilioDestino";
        }else if(filtro.equals("cliente")){
            filtro = "clienteSolicitante";
        }else if(filtro.equals("chofer")){
            filtro = "choferAsignado";
        }else if(filtro.equals("auto")){
            filtro = "autoAsignado";
        }else if(filtro.equals("fecha y hora")){
            filtro = "fechaDeRecogida";
        }else if(filtro.equals("km de viaje")){
            filtro = "kmDeViaje";
        }
        
        try{
            losViajes = viajeDAO.getViajesByFiltro(filtro, palabraClave);
        }catch(HibernateException ex){
            throw new Exception(ex);
        }
        
        return losViajes;
    }

    public Viaje updateViaje(Viaje viaje) throws Exception{
        
        try{
            viaje = viajeDAO.update(viaje);
        }catch(HibernateException ex){
            throw new Exception(ex);
        }
        
        return viaje;
        
    }

    public int getChoferesCount() throws Exception{
        int viajesTotales = 0;
        
        
        try{
            viajesTotales = viajeDAO.getCount(Viaje.class);
        }catch(HibernateException ex){
            throw new Exception(ex);
        }
        
        return viajesTotales; 
    }

    public List<Viaje> getAllViajesOrderByFecha(int paginaActual) throws Exception{
        List<Viaje> losViajes;
        
        int start = 0;
        if(paginaActual > 1){
            start = ((paginaActual - 1) * Constantes.PAG_MAX_RESULTS) + 1;
        }
        
        try{
            losViajes = viajeDAO.getAllOrderByFecha(start);
        }catch(HibernateException ex){
            throw new Exception(ex);
        }
        
        return losViajes;
    }
    
}
